package com.shijimo.server.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.shijimo.server.domain.Section;
import com.shijimo.server.domain.SectionExample;
import com.shijimo.server.dto.SectionDto;
import com.shijimo.server.dto.SectionPageDto;
import com.shijimo.server.enums.SectionChargeEnum;
import com.shijimo.server.mapper.SectionMapper;
import com.shijimo.server.util.CopyUtil;
import com.shijimo.server.util.UuidUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * @author Dream_飞翔
 * @email 1072876976@qq.com
 */

@Service
public class SectionService {
    @Resource
    private SectionMapper sectionMapper;

    @Resource
    private CourseService courseService;

    /**
     * 查询列表方法
     *
     * @param sectionPageDto 分页对象
     */
    public void list(SectionPageDto sectionPageDto) {
        // 开启mybatis分页，pageNum从1开始
        // 生效的位置是开启分页后下方的第一个select语句
        PageHelper.startPage(sectionPageDto.getPage(), sectionPageDto.getSize());

        SectionExample sectionExample = new SectionExample();
        // 创建查询对象，createCriteria()方法只会创建一次查询对象，相当于开启了where条件
        SectionExample.Criteria criteria = sectionExample.createCriteria();

        // 如果传来的courseId和chapterId不为空时再按照courseID进行查询
        if (!StringUtils.isEmpty(sectionPageDto.getCourseId())) {
            // 将courseId设置到查询对象当中
            criteria.andCourseIdEqualTo(sectionPageDto.getCourseId());
        }
        if (!StringUtils.isEmpty(sectionPageDto.getChapterId())) {
            // 将chapterId设置到查询对象当中
            criteria.andChapterIdEqualTo(sectionPageDto.getChapterId());
        }

        sectionExample.setOrderByClause("sort asc");

        // 进行查询
        List<Section> sectionList = sectionMapper.selectByExample(sectionExample);

        PageInfo<Section> pageInfo = new PageInfo<>(sectionList);
        // 查询到的总条数
        sectionPageDto.setTotal(pageInfo.getTotal());

        List<SectionDto> sectionDtoList = CopyUtil.copyList(sectionList, SectionDto.class);
        // 设置最终的查询结果
        sectionPageDto.setList(sectionDtoList);
    }

    /**
     * 保存修改结果
     * 1. 如果从前端传来的对象中Id有值的话就是更新操作
     * 2. 如果Id为空则说明是进行新增操作
     *
     * @param sectionDto 小节传输对象
     */
    @Transactional
    public void save(SectionDto sectionDto) {
        Section section = CopyUtil.copy(sectionDto, Section.class);
        // 判断Id是否有值
        if (StringUtils.isEmpty(sectionDto.getId())) {
            this.insert(section);
        } else {
            this.update(section);
        }
        /*
         * 如果在更新总时长时代码出现了异常情况，小节表和课程表的时长将会发生数据不一致
         * 增加事务处理
         * 在写好事务处理代码时要进行测试
         */
        // 更新课程的总时长
        courseService.updateTime(sectionDto.getCourseId());
    }

    /**
     * 添加方法
     */
    private void insert(Section section) {
        Date now = new Date();
        section.setCreatedAt(now);
        section.setUpdatedAt(now);

        // 设置Id
        section.setId(UuidUtil.getShortUuid());
        // 设置默认为收费状态
        section.setCharge(SectionChargeEnum.CHARGE.getCode());
        sectionMapper.insert(section);
    }

    /**
     * 更新方法
     */
    private void update(Section section) {
        section.setUpdatedAt(new Date());
        sectionMapper.updateByPrimaryKey(section);
    }

    /**
     * 删除方法
     */
    public void delete(String id) {
        sectionMapper.deleteByPrimaryKey(id);
    }
}
